package main

import "fmt"

/**
数组介绍
1、数组可以使用 range 进行遍历
2、数组是值类型
3、[10]int和[20]int是不同的类型
4、在 go 语言中一般不直接使用数组
5、实现打印数组，传递数组指针和不传递指针的区别
*/

/**
打印数组，此时传递进来的数组是外部数据的一个拷贝
修改此数组中的元素不会对外部的数组有任务影响
*/
func printlnArray(arr [5]int) {
	for _, value := range arr {
		fmt.Println(value)
	}
	// 此处修改了数组的第一个值，但是外部调用这个
	// printlnArray 的方法的外部数组的值不会变
	arr[0] = 50
}

/**
打印数组，传递指针
*/
func printlnPointArr(arr *[5]int) {
	for _, value := range arr {
		fmt.Println(value)
	}
	/**
	此处修改数组的第一个值为50，会对外部的数组产生影响
	因此此处是以指针进行传递的
	*/
	arr[0] = 50
}

func main() {
	// 定义一个int类型的数组，长度为3，且数组的初始元素的值为0
	var arr1 [3]int
	// 省略var关键字申明，则必须需要进行初始化
	arr2 := [3]int{10, 20, 30}
	// 数组的长度有...自动计算得出
	arr3 := [...]int{10, 20, 30, 40, 50}

	// 定义一个二维数组，3行2列
	var table [3][2]int

	fmt.Println(arr1, arr2, arr3)
	fmt.Println(table)

	// 遍历数组(下标，值)(_,value)
	for index, value := range arr2 {
		fmt.Println(index, value)
	}

	// 值传递打印数组
	fmt.Println("值传递打印数组")
	printlnArray(arr3)
	printlnArray(arr3)

	// 指针传递打印数组，此时会对外部数组的值产生影响
	// 此处需要传递数组
	printlnPointArr(&arr3)
	// 注意这个数组的第一个值，因为上面这个方法改变了第一个值
	fmt.Println(arr3)
}
